Dynamic Dispatch
実行時にオブジェクトの型を調べ、対応するメソッドを呼び出す
正確な型は実行時に初めてわかる
関数のインライン化ができない
動的ディスパッチには
シングルディスパッチ
の2つがあり、多重ディスパッチの中でも関与するオブジェクトが2つの時「ダブルディスパッチ」と言ったりする
イメージ
code:example
func(f: Piyo|Hoge) {
if (f instanceof Piyo) Piyo.f()
if (f instanceof Hoge) Hoge.f()
}
何が嬉しいか
Interfaceによるコードの再利用と分離ができる
以下のようなコードを書けば、関数fを
AとBどちらのインスタンスに対しても使える
code:ts
interface I {
m: () => number;
}
class A implements I {...} // (省略しているが)中でmを定義
class B implements I {...} // (省略しているが)中でmを定義
const f = (c: I) => {
console.log(c.m()); // A, Bどちらのm()を呼ぶかは実行時に決まる
}
const a = new A();
f(a);
const b = new B();
f(b);
別のクラスから生成されたa,bに対して、関数fを再利用できている
この時、A,Bどちらのm()を呼ぶかは、実行時にvtableを参照して決めるので、多少のオーバーヘッドがかかる 参考